Streszczenie

Celem niniejszego raportu jest analiza czynników wpływających na pojemność superkondensatorów oraz budowa modelu predykcyjnego. Zbiór danych wejściowych, liczący ponad 900 wierszy, poddano procesowi czyszczenia i transformacji. Wykonano w tym celu kodowanie zmiennych kategorialnych (Label Encoding) oraz uzupełnienie brakujących wartości. Przeprowadzono eksploracyjną analizę danych badając rozkłady i macierze korelacji. Na etapie modelowania wykorzystano algorytm drzew decyzyjnych do przewidywania pojemności. Raport kończy się oceną skuteczności modelu.

Wstęp

Wylistowanie użytych bibliotek oraz ustawienie seeda dla powtarzalności wyników.

knitr::opts_chunk$set(echo = TRUE, warning = FALSE)
library(dplyr)
library(tidyr)
library(ggplot2)
library(patchwork)
library(ggcorrplot)
library(plotly)
library(caret)
library(rpart.plot)
set.seed(23)

Wczytywanie danych

data <- read.csv("data.csv")

head(data)
##                      Ref. Limits.of.Potential.Window..V.
## 1 DOI: 10.1039/c7ta03093b                       0 to 0.8
## 2 DOI: 10.1039/c6ta10933k                         0 to 1
## 3 DOI: 10.1039/c6ta10933k                         0 to 1
## 4 DOI: 10.1039/c6ta10933k                         0 to 1
## 5 DOI: 10.1039/c6ta10933k                         0 to 1
## 6 DOI: 10.1039/d1se01134k                       0 to 0.5
##   Lower.Limit.of.Potential.Window..V. Upper.Limit.of.Potential.Window..V.
## 1                                   0                                 0.8
## 2                                   0                                 1.0
## 3                                   0                                 1.0
## 4                                   0                                 1.0
## 5                                   0                                 1.0
## 6                                   0                                 0.5
##   Potential.Window..V. Current.Density..A.g. Capacitance..F.g.
## 1                  0.8                     1               680
## 2                  1.0                     1               367
## 3                  1.0                     2               338
## 4                  1.0                     5               283
## 5                  1.0                    10               246
## 6                  0.5                     1               872
##   Specific.Surface.Area..m.2.g. Charge.Transfer.Resistance..Rct...ohm.
## 1                         186.3                                     NA
## 2                         537.0                                    6.1
## 3                         537.0                                    6.1
## 4                         537.0                                    6.1
## 5                         537.0                                    6.1
## 6                         168.2                                     NA
##   Equivalent.Series.Resistance..Rs...ohm.          Electrode.Configuration
## 1                                    7.70                   CNF/RGO/moOxNy
## 2                                    1.95 sulfur-doped graphene foam (SGF)
## 3                                    1.95 sulfur-doped graphene foam (SGF)
## 4                                    1.95 sulfur-doped graphene foam (SGF)
## 5                                    1.95 sulfur-doped graphene foam (SGF)
## 6                                    0.80                      moS2-moO2/G
##   Pore.Size..nm. Pore.Volume..cm.3.g. Ratio.of.ID.IG N.at. C.at. O.at.
## 1             NA                   NA           1.45   2.1    NA    NA
## 2             NA                   NA           1.28   0.0  85.6   9.1
## 3             NA                   NA           1.28   0.0  85.6   9.1
## 4             NA                   NA           1.28   0.0  85.6   9.1
## 5             NA                   NA           1.28   0.0  85.6   9.1
## 6             NA                   NA           1.22    NA    NA    NA
##   Electrolyte.Chemical.Formula Electrolyte.Ionic.Conductivity
## 1                        H2SO4                              7
## 2                          KOH                              6
## 3                          KOH                              6
## 4                          KOH                              6
## 5                          KOH                              6
## 6                          KOH                              6
##   Electrolyte.Concentration..M. Cell.Configuration..three.two.electrode.system.
## 1                             1                          three-electrode system
## 2                             6                            two-electrode system
## 3                             6                            two-electrode system
## 4                             6                            two-electrode system
## 5                             6                            two-electrode system
## 6                             2                          three-electrode system
summary(data)
##      Ref.           Limits.of.Potential.Window..V.
##  Length:925         Length:925                    
##  Class :character   Class :character              
##  Mode  :character   Mode  :character              
##                                                   
##                                                   
##                                                   
##                                                   
##  Lower.Limit.of.Potential.Window..V. Upper.Limit.of.Potential.Window..V.
##  Min.   :-1.1000                     Min.   :-0.2000                    
##  1st Qu.:-0.3000                     1st Qu.: 0.4000                    
##  Median : 0.0000                     Median : 0.6000                    
##  Mean   :-0.2343                     Mean   : 0.6301                    
##  3rd Qu.: 0.0000                     3rd Qu.: 0.8000                    
##  Max.   : 0.2000                     Max.   : 3.5000                    
##  NA's   :4                           NA's   :4                          
##  Potential.Window..V. Current.Density..A.g. Capacitance..F.g.
##  Min.   :0.4000       Min.   :  0.050       Min.   :   1.4   
##  1st Qu.:0.6000       1st Qu.:  1.000       1st Qu.: 148.6   
##  Median :0.8250       Median :  2.000       Median : 260.2   
##  Mean   :0.8634       Mean   :  5.857       Mean   : 415.5   
##  3rd Qu.:1.0000       3rd Qu.:  5.000       3rd Qu.: 509.9   
##  Max.   :3.5000       Max.   :200.000       Max.   :3344.1   
##  NA's   :5            NA's   :16            NA's   :17       
##  Specific.Surface.Area..m.2.g. Charge.Transfer.Resistance..Rct...ohm.
##  Min.   :   8.896              Min.   : 0.080                        
##  1st Qu.:  57.000              1st Qu.: 0.670                        
##  Median : 159.970              Median : 1.540                        
##  Mean   : 417.438              Mean   : 3.048                        
##  3rd Qu.: 546.000              3rd Qu.: 3.240                        
##  Max.   :2400.000              Max.   :24.200                        
##  NA's   :572                   NA's   :786                           
##  Equivalent.Series.Resistance..Rs...ohm. Electrode.Configuration
##  Min.   : 0.200                          Length:925             
##  1st Qu.: 0.350                          Class :character       
##  Median : 0.580                          Mode  :character       
##  Mean   : 1.602                                                 
##  3rd Qu.: 2.000                                                 
##  Max.   :17.500                                                 
##  NA's   :772                                                    
##  Pore.Size..nm.   Pore.Volume..cm.3.g. Ratio.of.ID.IG      N.at.      
##  Min.   : 0.530   Min.   :0.0200       Min.   :0.120   Min.   : 0.00  
##  1st Qu.: 3.045   1st Qu.:0.1680       1st Qu.:0.940   1st Qu.: 0.00  
##  Median : 4.337   Median :0.2170       Median :1.050   Median : 0.00  
##  Mean   : 8.618   Mean   :0.4857       Mean   :1.121   Mean   : 2.50  
##  3rd Qu.:13.625   3rd Qu.:0.5075       3rd Qu.:1.170   3rd Qu.: 3.20  
##  Max.   :44.131   Max.   :2.3500       Max.   :2.900   Max.   :23.82  
##  NA's   :769      NA's   :729          NA's   :596     NA's   :690    
##      C.at.           O.at.        Electrolyte.Chemical.Formula
##  Min.   : 1.40   Min.   : 1.900   Length:925                  
##  1st Qu.:37.32   1st Qu.: 8.883   Class :character            
##  Median :81.00   Median :13.700   Mode  :character            
##  Mean   :66.52   Mean   :19.176                               
##  3rd Qu.:85.58   3rd Qu.:27.098                               
##  Max.   :98.10   Max.   :54.280                               
##  NA's   :699     NA's   :703                                  
##  Electrolyte.Ionic.Conductivity Electrolyte.Concentration..M.
##  Min.   :1.000                  Min.   :0.100                
##  1st Qu.:6.000                  1st Qu.:1.000                
##  Median :6.000                  Median :1.000                
##  Mean   :5.806                  Mean   :2.576                
##  3rd Qu.:7.000                  3rd Qu.:6.000                
##  Max.   :8.000                  Max.   :6.000                
##  NA's   :99                     NA's   :62                   
##  Cell.Configuration..three.two.electrode.system.
##  Length:925                                     
##  Class :character                               
##  Mode  :character                               
##                                                 
##                                                 
##                                                 
## 

Jak można zauważyć dane nie są wyczyszczone. W wielu kolumnach występują wartości puste (NA). Zostaną one usunięte w kolejnym kroku.

Przygotowanie zbioru danych do analizy

Usunięcie kolumn, które nie niosą informacji

useful_col_data <- data %>%
  select(-Ref., -Limits.of.Potential.Window..V.)

str(useful_col_data)
## 'data.frame':    925 obs. of  19 variables:
##  $ Lower.Limit.of.Potential.Window..V.            : num  0 0 0 0 0 0 -0.4 -0.4 -0.4 -0.4 ...
##  $ Upper.Limit.of.Potential.Window..V.            : num  0.8 1 1 1 1 0.5 0.2 0.2 0.2 0.2 ...
##  $ Potential.Window..V.                           : num  0.8 1 1 1 1 0.5 0.6 0.6 0.6 0.6 ...
##  $ Current.Density..A.g.                          : num  1 1 2 5 10 1 1 1 1 1 ...
##  $ Capacitance..F.g.                              : num  680 367 338 283 246 872 143 306 360 483 ...
##  $ Specific.Surface.Area..m.2.g.                  : num  186 537 537 537 537 ...
##  $ Charge.Transfer.Resistance..Rct...ohm.         : num  NA 6.1 6.1 6.1 6.1 NA NA NA NA NA ...
##  $ Equivalent.Series.Resistance..Rs...ohm.        : num  7.7 1.95 1.95 1.95 1.95 0.8 NA NA NA NA ...
##  $ Electrode.Configuration                        : chr  "CNF/RGO/moOxNy" "sulfur-doped graphene foam (SGF)" "sulfur-doped graphene foam (SGF)" "sulfur-doped graphene foam (SGF)" ...
##  $ Pore.Size..nm.                                 : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Pore.Volume..cm.3.g.                           : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Ratio.of.ID.IG                                 : num  1.45 1.28 1.28 1.28 1.28 ...
##  $ N.at.                                          : num  2.1 0 0 0 0 NA NA NA NA NA ...
##  $ C.at.                                          : num  NA 85.6 85.6 85.6 85.6 NA NA NA NA NA ...
##  $ O.at.                                          : num  NA 9.1 9.1 9.1 9.1 NA NA NA NA NA ...
##  $ Electrolyte.Chemical.Formula                   : chr  " H2SO4" "KOH" "KOH" "KOH" ...
##  $ Electrolyte.Ionic.Conductivity                 : int  7 6 6 6 6 6 NA NA NA NA ...
##  $ Electrolyte.Concentration..M.                  : num  1 6 6 6 6 2 NA NA NA NA ...
##  $ Cell.Configuration..three.two.electrode.system.: chr  "three-electrode system" "two-electrode system" "two-electrode system" "two-electrode system" ...

Kolumna z identyfikatorem publikacji została usunięta, ponieważ nie wniesie nic do analizy. Kolumna z oknem potencjału jest tak naprawdę duplikatem kolumn z początkiem i końcem tego zakresu, więc również została usunięta.

Kolumny z ciągami znaków

useful_col_data %>%
  summarise(across(where(is.character), n_distinct))
##   Electrode.Configuration Electrolyte.Chemical.Formula
## 1                     353                           27
##   Cell.Configuration..three.two.electrode.system.
## 1                                               3
useful_col_data <- useful_col_data %>%
  select(-Electrode.Configuration, -Electrolyte.Chemical.Formula)

numeric_col_data <- useful_col_data %>%
  mutate(Cell.Configuration..three.two.electrode.system. = case_when(
    Cell.Configuration..three.two.electrode.system. == "" ~ 0,
    Cell.Configuration..three.two.electrode.system. == "three-electrode system" ~ 1,
    Cell.Configuration..three.two.electrode.system. == "two-electrode system" ~ 2
  ))

table(numeric_col_data$Cell.Configuration..three.two.electrode.system.)
## 
##   0   1   2 
##  14 730 181

Dwie kolumny z ciągami znaków zostały usunięte z powodu wystepowania zbyt wielu kategorii, co mogłoby rozmyć informację. Ostatnia z kolumn przechowująca informację o konfiguracji ogniwa została przekonwertowana na liczbową za pomocą podejścia Label Encoding zgodnie z poniższą tabelą:

Oryginalna wartość Label Encoding
"" (pusty) 0
three-electrode system 1
two-electrode system 2

Zastąpienie wartości pustych zerami

cleaned_data <- numeric_col_data %>%
  mutate(across(where(is.numeric), ~replace_na(as.numeric(.), 0)))

Sprawdzenie, czy nie ma wartości pustych

colSums(is.na(cleaned_data))
##             Lower.Limit.of.Potential.Window..V. 
##                                               0 
##             Upper.Limit.of.Potential.Window..V. 
##                                               0 
##                            Potential.Window..V. 
##                                               0 
##                           Current.Density..A.g. 
##                                               0 
##                               Capacitance..F.g. 
##                                               0 
##                   Specific.Surface.Area..m.2.g. 
##                                               0 
##          Charge.Transfer.Resistance..Rct...ohm. 
##                                               0 
##         Equivalent.Series.Resistance..Rs...ohm. 
##                                               0 
##                                  Pore.Size..nm. 
##                                               0 
##                            Pore.Volume..cm.3.g. 
##                                               0 
##                                  Ratio.of.ID.IG 
##                                               0 
##                                           N.at. 
##                                               0 
##                                           C.at. 
##                                               0 
##                                           O.at. 
##                                               0 
##                  Electrolyte.Ionic.Conductivity 
##                                               0 
##                   Electrolyte.Concentration..M. 
##                                               0 
## Cell.Configuration..three.two.electrode.system. 
##                                               0

Wszystkie wartości puste zostały zastąpione zerami, aby umożliwić dalszą analizę. Uznano, że ich nie podano, więc są traktowane jako zera. Należy jednak zauważyć, że w wielu kolumnach wartości NA stanowiły większość co świadczy o tym, że zbiór danych nie został należycie przygotowany.

Podstawowe statystyki

Rozmiar danych oraz statystyki

nrow(cleaned_data)
## [1] 925
ncol(cleaned_data)
## [1] 17
str(cleaned_data)
## 'data.frame':    925 obs. of  17 variables:
##  $ Lower.Limit.of.Potential.Window..V.            : num  0 0 0 0 0 0 -0.4 -0.4 -0.4 -0.4 ...
##  $ Upper.Limit.of.Potential.Window..V.            : num  0.8 1 1 1 1 0.5 0.2 0.2 0.2 0.2 ...
##  $ Potential.Window..V.                           : num  0.8 1 1 1 1 0.5 0.6 0.6 0.6 0.6 ...
##  $ Current.Density..A.g.                          : num  1 1 2 5 10 1 1 1 1 1 ...
##  $ Capacitance..F.g.                              : num  680 367 338 283 246 872 143 306 360 483 ...
##  $ Specific.Surface.Area..m.2.g.                  : num  186 537 537 537 537 ...
##  $ Charge.Transfer.Resistance..Rct...ohm.         : num  0 6.1 6.1 6.1 6.1 0 0 0 0 0 ...
##  $ Equivalent.Series.Resistance..Rs...ohm.        : num  7.7 1.95 1.95 1.95 1.95 0.8 0 0 0 0 ...
##  $ Pore.Size..nm.                                 : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Pore.Volume..cm.3.g.                           : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Ratio.of.ID.IG                                 : num  1.45 1.28 1.28 1.28 1.28 ...
##  $ N.at.                                          : num  2.1 0 0 0 0 0 0 0 0 0 ...
##  $ C.at.                                          : num  0 85.6 85.6 85.6 85.6 0 0 0 0 0 ...
##  $ O.at.                                          : num  0 9.1 9.1 9.1 9.1 0 0 0 0 0 ...
##  $ Electrolyte.Ionic.Conductivity                 : num  7 6 6 6 6 6 0 0 0 0 ...
##  $ Electrolyte.Concentration..M.                  : num  1 6 6 6 6 2 0 0 0 0 ...
##  $ Cell.Configuration..three.two.electrode.system.: num  1 2 2 2 2 1 2 2 2 2 ...
summary(cleaned_data)
##  Lower.Limit.of.Potential.Window..V. Upper.Limit.of.Potential.Window..V.
##  Min.   :-1.1000                     Min.   :-0.2000                    
##  1st Qu.:-0.3000                     1st Qu.: 0.4000                    
##  Median : 0.0000                     Median : 0.6000                    
##  Mean   :-0.2333                     Mean   : 0.6274                    
##  3rd Qu.: 0.0000                     3rd Qu.: 0.8000                    
##  Max.   : 0.2000                     Max.   : 3.5000                    
##  Potential.Window..V. Current.Density..A.g. Capacitance..F.g.
##  Min.   :0.0000       Min.   :  0.000       Min.   :   0.0   
##  1st Qu.:0.6000       1st Qu.:  1.000       1st Qu.: 143.5   
##  Median :0.8000       Median :  2.000       Median : 255.0   
##  Mean   :0.8587       Mean   :  5.756       Mean   : 407.9   
##  3rd Qu.:1.0000       3rd Qu.:  5.000       3rd Qu.: 493.6   
##  Max.   :3.5000       Max.   :200.000       Max.   :3344.1   
##  Specific.Surface.Area..m.2.g. Charge.Transfer.Resistance..Rct...ohm.
##  Min.   :   0.00               Min.   : 0.0000                       
##  1st Qu.:   0.00               1st Qu.: 0.0000                       
##  Median :   0.00               Median : 0.0000                       
##  Mean   : 159.30               Mean   : 0.4581                       
##  3rd Qu.:  83.11               3rd Qu.: 0.0000                       
##  Max.   :2400.00               Max.   :24.2000                       
##  Equivalent.Series.Resistance..Rs...ohm. Pore.Size..nm.   Pore.Volume..cm.3.g.
##  Min.   : 0.0000                         Min.   : 0.000   Min.   :0.0000      
##  1st Qu.: 0.0000                         1st Qu.: 0.000   1st Qu.:0.0000      
##  Median : 0.0000                         Median : 0.000   Median :0.0000      
##  Mean   : 0.2649                         Mean   : 1.453   Mean   :0.1029      
##  3rd Qu.: 0.0000                         3rd Qu.: 0.000   3rd Qu.:0.0000      
##  Max.   :17.5000                         Max.   :44.131   Max.   :2.3500      
##  Ratio.of.ID.IG       N.at.            C.at.           O.at.       
##  Min.   :0.0000   Min.   : 0.000   Min.   : 0.00   Min.   : 0.000  
##  1st Qu.:0.0000   1st Qu.: 0.000   1st Qu.: 0.00   1st Qu.: 0.000  
##  Median :0.0000   Median : 0.000   Median : 0.00   Median : 0.000  
##  Mean   :0.3986   Mean   : 0.635   Mean   :16.25   Mean   : 4.602  
##  3rd Qu.:1.0000   3rd Qu.: 0.000   3rd Qu.: 0.00   3rd Qu.: 0.000  
##  Max.   :2.9000   Max.   :23.820   Max.   :98.10   Max.   :54.280  
##  Electrolyte.Ionic.Conductivity Electrolyte.Concentration..M.
##  Min.   :0.000                  Min.   :0.000                
##  1st Qu.:5.000                  1st Qu.:1.000                
##  Median :6.000                  Median :1.000                
##  Mean   :5.185                  Mean   :2.403                
##  3rd Qu.:7.000                  3rd Qu.:6.000                
##  Max.   :8.000                  Max.   :6.000                
##  Cell.Configuration..three.two.electrode.system.
##  Min.   :0.000                                  
##  1st Qu.:1.000                                  
##  Median :1.000                                  
##  Mean   :1.181                                  
##  3rd Qu.:1.000                                  
##  Max.   :2.000

Analiza wartości atrybutów

for (c in colnames(cleaned_data)) {
  if (is.numeric(cleaned_data[[c]])) {
    plot <- ggplot(cleaned_data, aes(x = .data[[c]])) +
      geom_density(fill = "lightblue", alpha = 0.7) +
      ggtitle(paste("Wykres gęstości rozkładu wartości dla:", c))
    
    print(plot)
  }
  
}

Dla każdej kolumny numerycznej został przedstawiony wykres gęstości rozkładu wartości. Wykresy gęstościowe niosą więcej informacji, ponieważ pokazują, w jakim przedziale skupia się większość wartości. Można zauważyć, że w wielu kolumnach pojawiło się wiele zer po wyczyszczeniu wartości NA.

Korelacja

numeric_cols <- cleaned_data %>%
  select(where(is.numeric))

corr_matrix <- cor(numeric_cols, use = "pairwise.complete.obs")

ggcorrplot(corr_matrix,
           method = "square",
           type = "lower",
           lab = TRUE,
           lab_size = 5)

plot <- ggplot(cleaned_data, aes(x = Lower.Limit.of.Potential.Window..V., y = Upper.Limit.of.Potential.Window..V.)) + 
  geom_point(color = "lightgreen", alpha = 0.7, size = 2) +
  theme_minimal() +                                        
  labs(title = "Relacja granic zakresu okna potencjału",
       x = "Lower.Limit.of.Potential.Window..V.",                    
       y = "Upper.Limit.of.Potential.Window..V.")

ggplotly(plot)

Najwyższą korelację odnotowano pomiędzy dolnym a górnym limitem okna potencjałowego. Powyższy interaktywny wykres ilustruje, że wraz ze wzrostem dolnej granicy zakresu rośnie też górna.

Korelacja jest również wysoka pomiędzy wielkością przedziału, a górną granicą zakresu stabilności. Jest to korelacja, której można było się spodziewać. Jeśli granice przedziału się przesuwają, to cały przedział również się zwiększa.

Wysoka zależność na poziomie około 0.6 występuje także między Charge Transfer Resistance (Rct), czyli oporem transferu ładunku pomiędzy elektrodą a elektrolitem, a Equivalent Series Resistance (Rs), czyli całkowitym oporem wewnętrznym superkondensatora. Może to wynikać z tego, że opór między elektrodą a elektrolitem jest składową całkowitego oporu.

Niższą, lecz zauważalną korelację w granicach wartości 0.4 można zaobserwować pomiędzy powierzchnią właściwą, a całkowitą objętością porów oraz wielkością okna potencjału. Wskazuje to, że struktura materiału ma znaczenie i wpływa na okno potencjału, jednak korelacja nie jest na tyle wysoka, aby twierdzić że jest to jedyny czynnik, który na to wpływa.

plot <- ggplot(cleaned_data, aes(x = C.at., y = O.at.)) + 
  geom_point(color = "steelblue", alpha = 0.7, size = 2) +
  theme_minimal() +                                        
  labs(title = "Relacja węgiel vs tlen",
       x = "Stężenie węgla (% at.)",                    
       y = "Stężenie tlenu (% at.)")

ggplotly(plot)

Niska wartość korelacji występuje także pomiędzy procentami atomów węgla, azotu i tlenu. Przykładowo jak widać na powyższym wykresie, występuje zależność im więcej atomów węgla, tym mniej tlenu.

Ciekawą obserwacją jest także korelacja pomiędzy procentem atomów węgla a wielkością okna, w którym materiał pozostaje stabilny. Wynosi ona 0.33, a dla atomów tlenu i azotu jest równa bądź bliska zeru. Sugeruje to, że występowanie atomów węgla może mieć jakiś wpływ na potencjał superkondensatora.

Uczenie maszynowe

Predykcja za pomocą drzewa decyzyjnego

data_for_model <- cleaned_data

train_index <- createDataPartition(data_for_model$Capacitance..F.g., p = 0.7, list = FALSE)
train_set <- data_for_model[train_index, ]
test_set  <- data_for_model[-train_index, ]

ctrl <- trainControl(method = "cv", number = 10)

tree_model_caret <- train(Capacitance..F.g. ~ .,
                          data = train_set, 
                          method = "rpart", 
                          trControl = ctrl,
                          tuneLength = 10)

predictions <- predict(tree_model_caret, test_set)

Rysunek wygenerowanego drzewa

rpart.plot(tree_model_caret$finalModel, 
           type = 2,
           extra = 101,
           fallen.leaves = TRUE,
           box.palette = "BuGn",
           shadow.col = "gray",
           main = "Drzewo decyzyjne: Przewidywanie pojemności superkondensatora")

Wyniki

plot_data <- data.frame(
  Observed = test_set$Capacitance..F.g.,
  Predicted = predictions
)

plot <- ggplot(plot_data, aes(x = Observed, y = Predicted)) +
  geom_point(color = "blue", alpha = 0.6) +
  labs(title = "Wartości rzeczywiste vs przewidywane",
       x = "Rzeczywista pojemność",
       y = "Przewidywana pojemność") +
  theme_minimal()

ggplotly(plot)
summary(test_set$Capacitance..F.g.)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0   142.9   255.5   419.3   493.5  3111.5
results <- postResample(pred = predictions, obs = test_set$Capacitance)
print(results)
##        RMSE    Rsquared         MAE 
## 338.7790609   0.4833006 207.4666178
mean_capacitance <- mean(test_set$Capacitance..F.g., na.rm = TRUE)
# MAE = 207.5
error_percentage <- (207.5 / mean_capacitance) * 100
error_percentage
## [1] 49.48323